gdk/wayland: Add GdkDisplay call to query available globals
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 13 Feb 2018 13:28:44 +0000 (14:28 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 13 Feb 2018 14:47:57 +0000 (15:47 +0100)
The internal known_globals hashtable is used to carry accounting for
interfaces that depend on others (as ordering is not guaranteed), extend
its usage so it also keeps track of unimplemented interfaces (here at
least).

The API call will then use this to allow querying the globals offered by
the compositor, it will be useful to determine whether we can use
text-input protocols or should fallback to other IMs.

docs/reference/gdk/gdk4-sections.txt
gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkwaylanddisplay.h

index 76c1e161e9521da297a13d64bfc8e8cd878b2c80..fb4615c1d3495d1c9d0baefd95cba7992ef4525d 100644 (file)
@@ -975,6 +975,7 @@ gdk_wayland_device_get_wl_pointer
 gdk_wayland_device_get_wl_seat
 gdk_wayland_display_get_wl_compositor
 gdk_wayland_display_get_wl_display
+gdk_wayland_display_query_registry
 gdk_wayland_window_new_subsurface
 gdk_wayland_window_get_wl_surface
 gdk_wayland_window_set_use_custom_surface
index 6861f7de2189e3e9e8c843c0347bece7c9ca5bd3..645f1352d8894bd9738a630cec785dbbf00f2fd6 100644 (file)
@@ -384,7 +384,6 @@ gdk_registry_handle_global (void               *data,
 {
   GdkWaylandDisplay *display_wayland = data;
   struct wl_output *output;
-  gboolean handled = TRUE;
 
   GDK_NOTE (MISC,
             g_message ("add global %u, interface %s, version %u", id, interface, version));
@@ -507,12 +506,9 @@ gdk_registry_handle_global (void               *data,
                                                            &server_decoration_listener,
                                                            display_wayland);
     }
-  else
-    handled = FALSE;
 
-  if (handled)
-    g_hash_table_insert (display_wayland->known_globals,
-                         GUINT_TO_POINTER (id), g_strdup (interface));
+  g_hash_table_insert (display_wayland->known_globals,
+                       GUINT_TO_POINTER (id), g_strdup (interface));
 
   process_on_globals_closures (display_wayland);
 }
@@ -2077,3 +2073,37 @@ gdk_wayland_display_get_output_scale (GdkWaylandDisplay *display_wayland,
 
   return 0;
 }
+
+/**
+ * gdk_wayland_display_query_registry:
+ * @display: a wayland #GdkDisplay
+ * @interface: global interface to query in the registry
+ *
+ * Returns %TRUE if the the interface was found in the display
+ * wl_registry.global handler.
+ *
+ * Returns: %TRUE if the global is offered by the compositor
+ *
+ * Since: 3.94
+ **/
+gboolean
+gdk_wayland_display_query_registry (GdkDisplay  *display,
+                                   const gchar *global)
+{
+  GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
+  GHashTableIter iter;
+  gchar *value;
+
+  g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
+  g_return_val_if_fail (global != NULL, FALSE);
+
+  g_hash_table_iter_init (&iter, display_wayland->known_globals);
+
+  while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &value))
+    {
+      if (strcmp (value, global) == 0)
+        return TRUE;
+    }
+
+  return FALSE;
+}
index 70875663301ab8481e3f88490a3d2439d7e05ea5..8eee6435304491bb62d3408617ead1f30ecf6e8e 100644 (file)
@@ -59,6 +59,10 @@ void                    gdk_wayland_display_set_startup_notification_id (GdkDisp
 
 gboolean                gdk_wayland_display_prefers_ssd         (GdkDisplay *display);
 
+GDK_AVAILABLE_IN_4_0
+gboolean                gdk_wayland_display_query_registry      (GdkDisplay  *display,
+                                                                const gchar *global);
+
 G_END_DECLS
 
 #endif /* __GDK_WAYLAND_DISPLAY_H__ */